package com.ruoyi.inventory.service.impl;

import java.util.List;
import java.util.Date;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.inventory.mapper.TSpPartMapper;
import com.ruoyi.inventory.domain.TSpPart;
import com.ruoyi.inventory.service.ITSpPartService;
import com.ruoyi.system.service.IImageCleanupService;
import com.ruoyi.common.utils.SecurityUtils;
import com.alibaba.fastjson2.JSON;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 备件Service业务层处理
 *
 * @author ruoyi
 * @date 2025-09-26
 */
@Service
public class TSpPartServiceImpl implements ITSpPartService
{
    private static final Logger log = LoggerFactory.getLogger(TSpPartServiceImpl.class);

    @Autowired
    private TSpPartMapper tSpPartMapper;

    @Autowired
    private IImageCleanupService imageCleanupService;

    /**
     * 查询备件
     *
     * @param partNo 备件主键
     * @return 备件
     */
    @Override
    public TSpPart selectTSpPartByPartNo(String partNo)
    {
        return tSpPartMapper.selectTSpPartByPartNo(partNo);
    }

    /**
     * 查询备件列表
     *
     * @param tSpPart 备件
     * @return 备件
     */
    @Override
    public List<TSpPart> selectTSpPartList(TSpPart tSpPart)
    {
        return tSpPartMapper.selectTSpPartList(tSpPart);
    }

    /**
     * 新增备件
     *
     * @param tSpPart 备件
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int insertTSpPart(TSpPart tSpPart)
    {
        // 设置创建时间
        tSpPart.setCreatedAt(new Date());
        tSpPart.setUpdatedAt(new Date());
        
        int result = tSpPartMapper.insertTSpPart(tSpPart);
        
        // 记录图片关联关系
        if (result > 0 && tSpPart.getImageUrls() != null && !tSpPart.getImageUrls().isEmpty()) {
            recordPartImages(tSpPart.getPartNo(), tSpPart.getImageUrls());
        }
        
        return result;
    }

    /**
     * 修改备件
     *
     * @param tSpPart 备件
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int updateTSpPart(TSpPart tSpPart)
    {
        // 获取旧备件信息
        TSpPart oldPart = tSpPartMapper.selectTSpPartByPartNo(tSpPart.getPartNo());
        
        // 设置更新时间
        tSpPart.setUpdatedAt(new Date());
        
        int result = tSpPartMapper.updateTSpPart(tSpPart);
        
        // 处理图片关联关系
        if (result > 0) {
            updatePartImages(tSpPart.getPartNo(), oldPart, tSpPart);
        }
        
        return result;
    }

    /**
     * 批量删除备件
     *
     * @param partNos 需要删除的备件主键
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int deleteTSpPartByPartNos(String[] partNos)
    {
        // 删除备件关联的图片
        for (String partNo : partNos) {
            try {
                imageCleanupService.deleteBusinessImages("part", partNo, "images");
                log.info("删除备件 {} 关联的图片", partNo);
            } catch (Exception e) {
                log.error("删除备件 {} 关联的图片失败: {}", partNo, e.getMessage());
            }
        }
        
        return tSpPartMapper.deleteTSpPartByPartNos(partNos);
    }

    /**
     * 删除备件信息
     *
     * @param partNo 备件主键
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int deleteTSpPartByPartNo(String partNo)
    {
        // 删除备件关联的图片
        try {
            imageCleanupService.deleteBusinessImages("part", partNo, "images");
            log.info("删除备件 {} 关联的图片", partNo);
        } catch (Exception e) {
            log.error("删除备件 {} 关联的图片失败: {}", partNo, e.getMessage());
        }
        
        return tSpPartMapper.deleteTSpPartByPartNo(partNo);
    }

    /**
     * 记录备件图片关联关系
     */
    private void recordPartImages(String partNo, String imageUrlsJson) {
        try {
            List<String> imageUrls = JSON.parseArray(imageUrlsJson, String.class);
            Long userId = SecurityUtils.getUserId();
            
            for (String imageUrl : imageUrls) {
                if (imageUrl != null && !imageUrl.isEmpty()) {
                    // 从URL中提取文件名
                    String fileName = extractFileNameFromUrl(imageUrl);
                    if (fileName != null) {
                        imageCleanupService.recordImageAttachment(
                            fileName, "part", partNo, "images", userId
                        );
                        log.info("记录备件图片关联: {} -> {}", fileName, partNo);
                    }
                }
            }
        } catch (Exception e) {
            log.error("记录备件图片关联失败: {}", e.getMessage(), e);
        }
    }

    /**
     * 更新备件图片关联关系
     */
    private void updatePartImages(String partNo, TSpPart oldPart, TSpPart newPart) {
        try {
            String oldImageUrls = oldPart != null ? oldPart.getImageUrls() : null;
            String newImageUrls = newPart.getImageUrls();
            
            // 如果图片没有变化，直接返回
            if (oldImageUrls != null && oldImageUrls.equals(newImageUrls)) {
                return;
            }
            
            Long userId = SecurityUtils.getUserId();
            
            // 处理旧图片
            if (oldImageUrls != null && !oldImageUrls.isEmpty()) {
                List<String> oldUrls = JSON.parseArray(oldImageUrls, String.class);
                for (String oldUrl : oldUrls) {
                    if (oldUrl != null && !oldUrl.isEmpty()) {
                        String oldFileName = extractFileNameFromUrl(oldUrl);
                        if (oldFileName != null) {
                            imageCleanupService.updateImageAttachment(
                                oldFileName, null, "part", partNo, "images", userId
                            );
                        }
                    }
                }
            }
            
            // 处理新图片
            if (newImageUrls != null && !newImageUrls.isEmpty()) {
                recordPartImages(partNo, newImageUrls);
            }
            
        } catch (Exception e) {
            log.error("更新备件图片关联失败: {}", e.getMessage(), e);
        }
    }

    /**
     * 从URL中提取文件名
     */
    private String extractFileNameFromUrl(String url) {
        if (url == null || url.isEmpty()) {
            return null;
        }
        
        try {
            // 如果是完整的URL，提取文件名部分
            if (url.contains("/")) {
                return url.substring(url.lastIndexOf("/") + 1);
            }
            // 如果直接是文件名，直接返回
            return url;
        } catch (Exception e) {
            log.error("提取文件名失败: {}", url, e);
            return null;
        }
    }
}